package Algorithm.sort;
//自顶向下归并排序类UpToDownMergeSort继承了MergeSort抽象类,这个类需要范型T继承Comparable的范型
public class UpToDownMergeSort <T extends Comparable<T>>extends MergeSort<T>{
    //重写排序方法sort,将要排序的数组进行初始化
    @Override
    public void sort(T[] nums) {
        //将辅助数组的长度定义为要排序的数组的长度
        aux = (T[]) new Comparable[nums.length];
        //调用重载的short方法,将整个数组传入,参数依次是数组的头指针,数组的尾指针
        sort(nums, 0, nums.length - 1);
    }

    //重载的sort方法,传入数组,参数依次是头指针,尾指针;
    //递归分割,两路归并
    private void sort(T[] nums,int l,int h) {
        //当尾指针小于等于头指针,停止分割
        if (h<=l){
            return;
        }
        //通过计算划分出中间指针
        int mid=l+(h-l)/2;
        //分割数组nums[l]-nums[mid]前半部分
        sort(nums,l,mid);
        //分割数组nums[mid+1]-nums[h]后半部分
        sort(nums,mid + 1,h);
        //传入前半部分nums[l]-mums[mid]和后半部分mus[mid+1]-nums[h]进行合并
        merge(nums,l,mid,h);//合并数组,参数l,m,h依次是数组的头指针,中间指针,尾指针,根据这三个参数划分数组前部分和后部分
    }
}
